/*
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * RStypes.h
 *
 *  Created on: 2010/02/15
 *      Author: Alexandre Pires ( c.alexandre.pires@gmail.com )
 */

#ifndef RSTYPES_H_
#define RSTYPES_H_

#include "RSGeneralDefs.h"
#include <QObject>

QT_BEGIN_NAMESPACE
class                                               QObject;
class                                               QVector4D;
class                                               QVector3D;
class                                               QVector2D;
class                                               QQuaternion;
class                                               QMatrix4x4;
class                                               QTextStream;
class                                               QVariant;
class                                               QMetaObject;
class                                               QXmlStreamWriter;
class                                               QObjectCleanupHandler;
class                                               QMetaProperty;

template <typename T>
class                                               QList;
template <typename T>
class                                               QVector;

QT_END_NAMESPACE

RS_BEGIN_NAMESPACE

    enum RSGeometricElementType {
            RS_CONVEX_MESH, RS_MESH,
            RS_SPLINE, RS_BREP, RS_GEOMETRIC_ELEMENT_UNKNOWN
    };

    enum RSPrimitivesElementType {
            RS_LINES, RS_LINESTRIPS, RS_POLYGONS,
            RS_POLYLIST, RS_TRIANGLES, RS_TRIFANS,
            RS_TRISTRIPS, RS_PRIMITIVES_UNKNOWN
    };

    enum RSInputSemanticType {
            RS_SEMANTIC_BINORMAL, RS_SEMANTIC_COLOR, RS_SEMANTIC_CONTINUITY,
            RS_SEMANTIC_IMAGE, RS_SEMANTIC_INPUT, RS_SEMANTIC_IN_TANGENT,
            RS_SEMANTIC_INTERPOLATION, RS_SEMANTIC_INV_BIND_MATRIX, RS_SEMANTIC_JOINT,
            RS_SEMANTIC_LINEAR_STEPS, RS_SEMANTIC_MORPH_TARGET, RS_SEMANTIC_MORPH_WEIGHT,
            RS_SEMANTIC_NORMAL, RS_SEMANTIC_OUTPUT, RS_SEMANTIC_OUT_TANGENT,
            RS_SEMANTIC_POSITION, RS_SEMANTIC_TANGENT, RS_SEMANTIC_TEXBINORMAL,
            RS_SEMANTIC_TEXCOORD, RS_SEMANTIC_TEXTANGENT, RS_SEMANTIC_UV,
            RS_SEMANTIC_VERTEX, RS_SEMANTIC_WEIGHT, RS_SEMANTIC_UNKNOWN
    };

    enum RSNodeType {
            RS_NODE, RS_JOINT
    };

    enum RSTransformationType {
            RS_LOOK_AT, RS_MATRIX, RS_ROTATE,
            RS_SCALE, RS_SKEW, RS_TRANSLATE,
            RS_TRANSFORMATION_UNKNOWN
    };

    enum RSTechniqueProfileType {
            RS_TECHNIQUE_SPECIFIC,
            RS_TECHNIQUE_COMMON,
            RS_TECHNIQUE_UNKNOWN
    };

    enum RSProjectionElementType {
            RS_ORTOGRAPHIC,
            RS_PERSPECTIVE,
            RS_PROJECTION_ELEMENT_UNKNOWN
    };

    enum RSInstanceType {
            RS_ANIMATION_INSTANCE,
            RS_CAMERA_INSTANCE,
            RS_CONTROLLER_INSTANCE,
            RS_FORMULA_INSTANCE,
            RS_GEOMETRY_INSTANCE,
            RS_LIGHT_INSTANCE,
            RS_NODE_INSTANCE,
            RS_VISUAL_SCENE_INSTANCE,
            RS_UNKNOWN_INSTANCE
    };

    class                                           RSObject;
    class                                           RSDocument;
    class                                           RSElement;
    class                                           RSUIDElement;
    class                                           RSGeometriesLibrary;
    class                                           RSGeometry;
    class                                           RSGeometricElement;
    class                                           RSPrimitivesElement;
    class                                           RSMesh;
    class                                           RSRenderer;
    class                                           RSSerializer;
    class                                           RSDataSource;
    class                                           RSSource;
    class                                           RSInput;
    class                                           RSVertices;
    class                                           RSPrimitiveIndices;
    class                                           RSScene;
    class                                           RSNodeBase;
    class                                           RSNode;
    class                                           RSTransformationElement;
    class                                           RSTranslate;
    class                                           RSRotate;
    class                                           RSScale;
    class                                           RSVisualScene;
    class                                           RSVisualScenesLibrary;
    class                                           RSCamera;
    class                                           RSOptics;
    class                                           RSImager;
    class                                           RSCamerasLibrary;
    class                                           RSTechniqueCommon;
    class                                           RSTechnique;
    class                                           RSTechniqueElement;
    class                                           RSProjectionTechniqueElement;
    class                                           RSProjectionTechnique;
    class                                           RSOrthographic;
    class                                           RSPerspective;
    class                                           RSBufferManager;
    class                                           RSInstance;
    class                                           RSAccessor;
    class                                           RSParam;


    class                                           RSValueElement;
    class                                           RSBool;
    class                                           RSFloat;
    class                                           RSInt;
    class                                           RSName;

    enum RSValueType {
            RS_BOOL,
            RS_FLOAT,
            RS_INT,
            RS_NAME
    };

    class                                           RSArrayElement;
    class                                           RSBoolArray;
    class                                           RSFloatArray;
    class                                           RSIntArray;

    enum RSArrayElementType {
            RS_BOOL_ARRAY, RS_FLOAT_ARRAY, RS_IDREF_ARRAY,
            RS_INT_ARRAY,RS_NAME_ARRAY, RS_SIDREF_ARRAY,
            RS_TOKEN_ARRAY,
    };

    typedef QList<RSElement*>                       RSElements;
    typedef QListIterator<RSElement*>               RSElementsIterator;
    typedef QList<RSUIDElement*>                    RSUIDElements;
    typedef QListIterator<RSUIDElement*>            RSUIDElementsIterator;
    typedef QList<RSGeometriesLibrary*>             RSGeometriesLibraries;
    typedef QListIterator<RSGeometriesLibrary*>     RSGeometriesLibrariesIterator;
    typedef QList<RSGeometry*>                      RSGeometries;
    typedef QListIterator<RSGeometry*>              RSGeometriesIterator;
    typedef QList<RSPrimitivesElement*>             RSPrimitivesElements;
    typedef QListIterator<RSPrimitivesElement*>     RSPrimitivesElementsIterator;
    typedef QList<RSSource*>                        RSSources;
    typedef QListIterator<RSSource*>                RSSourcesIterator;
    typedef QList<RSInput*>                         RSInputs;
    typedef QListIterator<RSInput*>                 RSInputsIterator;
    typedef QVector<unsigned int>                   RSIndices;
    typedef QList<RSNodeBase*>                      RSNodes;
    typedef QListIterator<RSNodeBase*>              RSNodesIterator;
    typedef QList<RSVisualScene*>                   RSVisualScenes;
    typedef QListIterator<RSVisualScene*>           RSVisualScenesIterator;
    typedef QList<RSVisualScenesLibrary*>           RSVisualScenesLibraries;
    typedef QListIterator<RSVisualScenesLibrary*>   RSVisualScenesLibrariesIterator;
    typedef QList<RSTransformationElement*>         RSTransformations;
    typedef QListIterator<RSTransformationElement*> RSTransformationsIterator;
    typedef QList<RSCamera*>                        RSCameras;
    typedef QListIterator<RSCamera*>                RSCamerasIterator;
    typedef QList<RSCamerasLibrary*>                RSCamerasLibraries;
    typedef QListIterator<RSCamerasLibrary*>        RSCamerasLibrariesIterator;
    typedef QList<RSTechnique*>                     RSTechniques;
    typedef QListIterator<RSTechnique*>             RSTechniquesIterator;
    typedef QList<RSTechniqueElement*>              RSTechniqueElements;
    typedef QListIterator<RSTechniqueElement*>      RSTechniqueElementsIterator;
    typedef QList<RSValueElement*>                  RSValueElements;
    typedef QListIterator<RSValueElement*>          RSValueElementsIterator;
    typedef QList<RSParam*>                         RSParams;
    typedef QListIterator<RSParam*>                 RSParamsIterator;
    typedef QList<RSDataSource*>                    RSDataSources;
    typedef QListIterator<RSDataSource*>            RSDataSourcesIterator;

    typedef QList<RSObject*>                        RSObjectList;
    typedef QListIterator<RSObject*>                RSObjectListIterator;

    typedef int                                     RSDataSize;
    typedef void*                                   RSDataPointer;

RS_END_NAMESPACE

#endif /* RSTYPES_H_ */
